package domain;

import java.io.Serializable;
import javax.persistence.*;

import ui.graphical.UIHelper;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Date;
import java.util.Set;


/**
 * The persistent class for the planning database table.
 * 
 */
@Entity
@Table(name="planning")
@NamedQueries({
    @NamedQuery(name = "Planning.findByReisId", query = "SELECT p FROM Planning p WHERE p.reis.reisId = :reis_id"),
    /*
     * Om een overlap in een nieuw in te plannen periode met startdatum en einddatum te vinden 
     * voor een bepaalde gids wordt gekeken of er een planning record bestaat waarvan
     * p.startdatum >= einddatum is en p.einddatum <= startdatum; er wordt >= en <= gebruikt
     * omdat de einddatum ook wordt meegerekend als reisdag.
     */
    @NamedQuery(name = "Planning.checkGidsBezet", query = "SELECT p FROM Planning p WHERE p.planningId <> :planning_id AND p.gids.persoonId = :persoon_id AND p.startdatum <= :einddatum AND p.einddatum >= :startdatum"),
    @NamedQuery(name = "Planning.findByPlanningId", query = "SELECT p FROM Planning p WHERE p.planningId = :planning_id")})
public class Planning implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="planning_id", unique=true, nullable=false)
	private int planningId;

	@Column(name="boekings_kosten", nullable=false, precision=10, scale=2)
	private BigDecimal boekingsKosten;

    @Temporal( TemporalType.DATE)
	@Column(nullable=false)
	private Date einddatum;

	@Column(nullable=false, length=5)
	private String inchecktijd;

	@Column(nullable=false, precision=10, scale=2)
	private BigDecimal luchthavenbelasting;

	@Column(name="max_deelnemers", nullable=false)
	private int maxDeelnemers;

	@Column(name="min_deelnemers", nullable=false)
	private int minDeelnemers;

	@Column(nullable=false, precision=10, scale=2)
	private BigDecimal prijs;

	@Column(name="prijs_eten", nullable=false, precision=10, scale=2)
	private BigDecimal prijsEten;

	@Column(name="prijs_gids", nullable=false, precision=10, scale=2)
	private BigDecimal prijsGids;

	@Column(name="prijs_overnachtingen", nullable=false, precision=10, scale=2)
	private BigDecimal prijsOvernachtingen;

	@Column(name="prijs_vervoer", nullable=false, precision=10, scale=2)
	private BigDecimal prijsVervoer;

	@Column(name="prijs_vlucht", nullable=false, precision=10, scale=2)
	private BigDecimal prijsVlucht;

    @Temporal( TemporalType.DATE)
	@Column(nullable=false)
	private Date startdatum;

	@Column(nullable=false, length=50)
	private String vertrekpunt;

	@Column(nullable=false, length=5)
	private String vertrektijd;

	//bi-directional many-to-one association to Persoon
    @ManyToOne
	@JoinColumn(name="gids_id", nullable=false)
	private Persoon gids;

	//bi-directional many-to-one association to Rei
    @ManyToOne
	@JoinColumn(name="reis_id", nullable=false)
	private Reis reis;

	//bi-directional many-to-one association to Reservering
	@OneToMany(mappedBy="planning", fetch=FetchType.EAGER)
	private Set<Reservering> reserveringen;

    public Planning() {
    }

	public int getPlanningId() {
		return this.planningId;
	}

	public void setPlanningId(int planningId) {
		this.planningId = planningId;
	}

	public BigDecimal getBoekingsKosten() {
		return this.boekingsKosten;
	}

	public void setBoekingsKosten(BigDecimal boekingsKosten) {
		this.boekingsKosten = boekingsKosten;
	}

	public Date getEinddatum() {
		return this.einddatum;
	}

	public void setEinddatum(Date einddatum) {
		this.einddatum = einddatum;
	}

	public String getInchecktijd() {
		return this.inchecktijd;
	}

	public void setInchecktijd(String inchecktijd) {
		this.inchecktijd = inchecktijd;
	}

	public BigDecimal getLuchthavenbelasting() {
		return this.luchthavenbelasting;
	}

	public void setLuchthavenbelasting(BigDecimal luchthavenbelasting) {
		this.luchthavenbelasting = luchthavenbelasting;
	}

	public int getMaxDeelnemers() {
		return this.maxDeelnemers;
	}

	public void setMaxDeelnemers(int maxDeelnemers) {
		this.maxDeelnemers = maxDeelnemers;
	}

	public int getMinDeelnemers() {
		return this.minDeelnemers;
	}

	public void setMinDeelnemers(int minDeelnemers) {
		this.minDeelnemers = minDeelnemers;
	}

	public BigDecimal getPrijs() {
		return this.prijs;
	}

	public void setPrijs(BigDecimal prijs) {
		this.prijs = prijs;
	}

	public BigDecimal getPrijsEten() {
		return this.prijsEten;
	}

	public void setPrijsEten(BigDecimal prijsEten) {
		this.prijsEten = prijsEten;
	}

	public BigDecimal getPrijsGids() {
		return this.prijsGids;
	}

	public void setPrijsGids(BigDecimal prijsGids) {
		this.prijsGids = prijsGids;
	}

	public BigDecimal getPrijsOvernachtingen() {
		return this.prijsOvernachtingen;
	}

	public void setPrijsOvernachtingen(BigDecimal prijsOvernachtingen) {
		this.prijsOvernachtingen = prijsOvernachtingen;
	}

	public BigDecimal getPrijsVervoer() {
		return this.prijsVervoer;
	}

	public void setPrijsVervoer(BigDecimal prijsVervoer) {
		this.prijsVervoer = prijsVervoer;
	}

	public BigDecimal getPrijsVlucht() {
		return this.prijsVlucht;
	}

	public void setPrijsVlucht(BigDecimal prijsVlucht) {
		this.prijsVlucht = prijsVlucht;
	}

	public Date getStartdatum() {
		return this.startdatum;
	}

	public void setStartdatum(Date startdatum) {
		this.startdatum = startdatum;
	}

	public String getVertrekpunt() {
		return this.vertrekpunt;
	}

	public void setVertrekpunt(String vertrekpunt) {
		this.vertrekpunt = vertrekpunt;
	}

	public String getVertrektijd() {
		return this.vertrektijd;
	}

	public void setVertrektijd(String vertrektijd) {
		this.vertrektijd = vertrektijd;
	}

	public Persoon getGids() {
		return this.gids;
	}

	public void setGids(Persoon gids) {
		this.gids = gids;
	}
	
	public Reis getReis() {
		return this.reis;
	}

	public void setReis(Reis reis) {
		this.reis = reis;
	}
	
	public Set<Reservering> getReserveringen() {
		return this.reserveringen;
	}

	public void setReserveringen(Set<Reservering> reserveringen) {
		this.reserveringen = reserveringen;
	}
	
	public int getAantalDeelnemers() {
		int deelnemers = 0;
		Set<Reservering> reserveringen =  getReserveringen();
		for(Reservering reservering : reserveringen) {
			deelnemers += reservering.getAantaldeelnemers();
		}		
		return deelnemers;
	}

	@Override
	public boolean equals(Object obj) {
		return (obj!=null && obj instanceof Planning && ((Planning)obj).getPlanningId()==getPlanningId());
	}

	@Override
	public String toString() {
		return UIHelper.date2string(startdatum);
	}
}